package com.sisgesbyte.web.managedBean.mantenimiento.administracion;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.services.administracion.MantEstadosAtencionClienteService;
import com.sisgesbyte.services.administracion.MantenimientoAreaEmpresa;
import com.sisgesbyte.services.administracion.MantenimientoAtencionCliente;
import com.sisgesbyte.services.administracion.MantenimientoTemasAtencion;
import com.sisgesbyte.services.administracion.bean.AreaEmpresaBean;
import com.sisgesbyte.services.administracion.bean.AreasEmpresaListaResponse;
import com.sisgesbyte.services.administracion.bean.AtencionClienteBean;
import com.sisgesbyte.services.administracion.bean.AtencionClienteListaResponse;
import com.sisgesbyte.services.administracion.bean.EstadosAtencionClienteBean;
import com.sisgesbyte.services.administracion.bean.ListaEstadosAtencionClienteResponse;
import com.sisgesbyte.services.administracion.bean.TemaAtencionBean;
import com.sisgesbyte.services.administracion.bean.TemaAtencionListaResponse;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.web.managedBean.common.MantenimientoAbstract;
import com.sisgesbyte.web.managedBean.seguridad.OpcionesControlador;

@ManagedBean
@ViewScoped
public class AtencionClienteMBean extends MantenimientoAbstract implements Serializable{

	private static final long serialVersionUID = 1L;
	
	@EJB
	private MantenimientoAtencionCliente mantenimientoAtencionCliente;
	@EJB
	private MantenimientoAreaEmpresa mantenimientoAreaEmpresa;
	@EJB
	private MantenimientoTemasAtencion mantenimientoTemasAtencion;
	@EJB
	private MantEstadosAtencionClienteService mantEstadosAtencionClienteService;
	@Inject
	private Validaciones validaciones;
	@ManagedProperty(value = "#{opcionesControlador}")
	private OpcionesControlador opcionesControlador;
	private List<AtencionClienteBean> listaAtencionCliente;
	private List<AtencionClienteBean> selectedAtencionCliente;
	private List<AreaEmpresaBean> listaAreasEmpresa;
	private List<TemaAtencionBean> listaTemasAtencion;
	private FiltrosSQLBean cadenaFiltros;
	private String tipoMantenimiento;
	private String saved;
	private String txtBuscar;
	private List<EstadosAtencionClienteBean> listaEstadosAtencionCliente;
	
	@PostConstruct
	private void init() {
		saved = "";
		tipoMantenimiento = "";
		txtBuscar = "";
		crearFiltro();
		cargarAreas();
		inicializar();
		cargarEstados();
	}
	
	public Validaciones getValidaciones() {
		return validaciones;
	}

	public void setValidaciones(Validaciones validaciones) {
		this.validaciones = validaciones;
	}

	public OpcionesControlador getOpcionesControlador() {
		return opcionesControlador;
	}

	public void setOpcionesControlador(OpcionesControlador opcionesControlador) {
		this.opcionesControlador = opcionesControlador;
	}

	public List<AtencionClienteBean> getListaAtencionCliente() {
		return listaAtencionCliente;
	}

	public void setListaAtencionCliente(
			List<AtencionClienteBean> listaAtencionCliente) {
		this.listaAtencionCliente = listaAtencionCliente;
	}

	public List<AtencionClienteBean> getSelectedAtencionCliente() {
		return selectedAtencionCliente;
	}

	public void setSelectedAtencionCliente(
			List<AtencionClienteBean> selectedAtencionCliente) {
		this.selectedAtencionCliente = selectedAtencionCliente;
	}

	public FiltrosSQLBean getCadenaFiltros() {
		return cadenaFiltros;
	}

	public void setCadenaFiltros(FiltrosSQLBean cadenaFiltros) {
		this.cadenaFiltros = cadenaFiltros;
	}

	public String getTipoMantenimiento() {
		return tipoMantenimiento;
	}

	public void setTipoMantenimiento(String tipoMantenimiento) {
		this.tipoMantenimiento = tipoMantenimiento;
	}

	public String getSaved() {
		return saved;
	}

	public void setSaved(String saved) {
		this.saved = saved;
	}

	public String getTxtBuscar() {
		return txtBuscar;
	}

	public void setTxtBuscar(String txtBuscar) {
		this.txtBuscar = txtBuscar;
	}

	@Override
	public void inicializar() {
		try {
			AtencionClienteListaResponse response = mantenimientoAtencionCliente.listaAtencionCliente(ObtenerIdTransaccion(), cadenaFiltros);
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				listaAtencionCliente = response.getListaAtencionBean();
			} else {
				System.out.println("No se encontro Data "+ response.getMensajeRespuesta());
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error al cargar Lista " + e);
		}
	}

	@Override
	public void unSelect(UnselectEvent event) {
		opcionesControlador.habilitarControles(selectedAtencionCliente.size());
	}

	@Override
	public void checkSelect(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedAtencionCliente.size());
	}

	@Override
	public void seleccionarItem(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedAtencionCliente.size());
	}

	public List<AreaEmpresaBean> getListaAreasEmpresa() {
		return listaAreasEmpresa;
	}

	public void setListaAreasEmpresa(List<AreaEmpresaBean> listaAreasEmpresa) {
		this.listaAreasEmpresa = listaAreasEmpresa;
	}

	public List<TemaAtencionBean> getListaTemasAtencion() {
		return listaTemasAtencion;
	}

	public void setListaTemasAtencion(List<TemaAtencionBean> listaTemasAtencion) {
		this.listaTemasAtencion = listaTemasAtencion;
	}
	

	public List<EstadosAtencionClienteBean> getListaEstadosAtencionCliente() {
		return listaEstadosAtencionCliente;
	}

	public void setListaEstadosAtencionCliente(
			List<EstadosAtencionClienteBean> listaEstadosAtencionCliente) {
		this.listaEstadosAtencionCliente = listaEstadosAtencionCliente;
	}

	@Override
	public void dobleSelect(SelectEvent event) {
		List<AtencionClienteBean> selected = new ArrayList<AtencionClienteBean>();
		selected.add((AtencionClienteBean) event.getObject());
		setSelectedAtencionCliente(selected);
		setSaved("");
		cargarTemas();
		opcionesControlador.habilitarControles(selectedAtencionCliente.size());
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void nuevoItem() {
		setSaved("");
		limpiarFormulario();
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO);
	}

	@Override
	public void editItem() {
		setSaved("");
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void updateInsertItem() {
		if (tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_NUEVO)) {
			guardarItem();
		}
		if (tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE)) {
			modificarItem();
		}
	}
	public void cargarAreas(){
		try {
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			filtroSQL.setCampoOrden("id");
			filtroSQL.setTipoOrden("desc");
			AreasEmpresaListaResponse response = mantenimientoAreaEmpresa.listarAreasEmpresa(ObtenerIdTransaccion(), filtroSQL);
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				listaAreasEmpresa= response.getListaAreasEmpresa();
			} else {
				System.out.println("No se encontro Data "+ response.getMensajeRespuesta());
			}
		} catch (Exception e) {
			System.out.println("Ocurrio un error al cargar Lista " + e);
		}
	}
	public void cargarTemas(){
		try {
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			List<FiltrosBean> listaCampos = new ArrayList<FiltrosBean>();
			List<Object> valores = new ArrayList<>();
			FiltrosBean filtros = new FiltrosBean();
			List<String> campos = new ArrayList<String>();
			campos.add("ta.area_empresa_id");
			filtros.setCampos(campos);
			listaCampos.add(filtros);
			filtros.setOperador("=");
			valores.add(selectedAtencionCliente.get(0).getAreaEmpresaId());
			filtroSQL.setListaFiltros(listaCampos);
			filtroSQL.setListaValores(valores);
			filtroSQL.setCampoOrden("ta.descripcion");
			filtroSQL.setTipoOrden("asc");
			TemaAtencionListaResponse response =mantenimientoTemasAtencion.listaTemasAtencion(ObtenerIdTransaccion(), filtroSQL);
			if (Integer.valueOf(response.getCodigoRespuesta()) > -1) {
				
				listaTemasAtencion= response.getListaTemasAtencion();
			} else {
				System.out.println("No se encontro Data "+ response.getMensajeRespuesta());
			}
			System.out.println("Total Temas: "+response.getListaTemasAtencion().size());
		} catch (Exception e) {
			System.out.println("Ocurrio un error al mostrar los temas " + e);
		}
	}
	@Override
	public String ObtenerIdTransaccion() {
		FacesContext fCtx = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
		String sessionId = session.getId().replace(".undefined", "");
		return sessionId;
	}

	@Override
	public void guardarItem() {
		GenericResponse response = null;
		try {
			for (AtencionClienteBean bean : listaSeleccionados(selectedAtencionCliente)) {
				response = mantenimientoAtencionCliente.nuevaAtencionCliente( ObtenerIdTransaccion(), bean);
				if (response.getCodigoRespuesta().equals( ConstantesInternasSistema.CODIGO_EXITO)) {
					setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
					System.out.println("Se registro Correctamente");
				} else {
					setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
					System.out.println("Hubo un error al Registrar " + response.getCodigoRespuesta() + " - " + response.getMensajeRespuesta());
				}
			}
			limpiarFormulario();
			inicializar();
		} catch (Exception e) {
			setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
			System.out.println("Error en el proceso " + e);
		}
	}

	@Override
	public void modificarItem() {
		GenericResponse response = null;
		try {
			for (AtencionClienteBean bean : listaSeleccionados(selectedAtencionCliente)) {
				response = mantenimientoAtencionCliente.editarAtencionCliente(ObtenerIdTransaccion(), bean);
				if (response.getCodigoRespuesta().equals( ConstantesInternasSistema.CODIGO_EXITO)) {
					setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
					System.out.println("Se Acualizo correctamente");
				} else {
					setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
					System.out.println("Hubo un Error al Actualizar de BD " + response.getCodigoRespuesta() + " - " + response.getMensajeRespuesta());
				}
			}
			inicializar();
		} catch (Exception e) {
			System.out.println("Error en el proceso " + e);
		}
	}

	@Override
	public void eliminarItem() {
		GenericResponse response = null;
		try {
			for (AtencionClienteBean bean : selectedAtencionCliente) {
				response = mantenimientoAtencionCliente.deleteAtencionCliente(
						ObtenerIdTransaccion(), bean.getId());
				if (response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)) {
					System.out.println("Se elimino Correctamente");
				} else {
					System.out.println("No se pudo Eliminar de BD "
							+ response.getCodigoRespuesta() + " - "
							+ response.getMensajeRespuesta());
				}
			}
			inicializar();
			opcionesControlador.desactivarControles();
		} catch (Exception e) {
			System.out.println("Hubo un error al tratar de Eliminar " + e);
		}
	}

	@Override
	public void actualizarEstado() {
		GenericResponse response = null;
		try {
			for (AtencionClienteBean bean : listaSeleccionados(listaAtencionCliente)) {
				response = mantenimientoAtencionCliente.editarAtencionCliente(ObtenerIdTransaccion(), bean);
				if (response.getCodigoRespuesta().equals(ConstantesInternasSistema.CODIGO_EXITO)) {
					System.out.println("Se Acualizo correctamente");
				} else {
					System.out.println("No se pudo actualizar el Item con codigo "+ bean.getId());
				}
			}
			inicializar();
		} catch (Exception e) {
			System.out.println("Hubo un error al actualizar el estado");
		}
	}

	@Override
	public void limpiarFormulario() {
		List<AtencionClienteBean> listaBean = new ArrayList<AtencionClienteBean>();
		AtencionClienteBean bean = new AtencionClienteBean();
		bean.setActive(false);
		listaBean.add(bean);
		setSelectedAtencionCliente(listaBean);
	}

	@Override
	public void crearFiltro() {
		FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
		try {
			if (getTxtBuscar() != null && getTxtBuscar().toString().length() > 0) {
				List<Object> valores = new ArrayList<>();
				List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
				FiltrosBean listaCampo = new FiltrosBean();
				List<String> campo = new ArrayList<String>();
				campo.add("ac.id");
				campo.add("ac.nombre");
				campo.add("ac.apellido");
				campo.add("ac.email");
				campo.add("ac.telefono");
				campo.add("ta.descripcion");
				campo.add("ae.nombre");
				listaCampo.setCampos(campo);
				listaCampo.setOperador("like");
				filtro.add(listaCampo);
				filtroSQL.setListaFiltros(filtro);
				valores.add("%" + getTxtBuscar() + "%");
				filtroSQL.setListaValores(valores);

			} else {
				filtroSQL.setCampoOrden("ac.id");
				filtroSQL.setTipoOrden("desc");
			}
			setCadenaFiltros(filtroSQL);
			inicializar();
			opcionesControlador.habilitarControles(0);
		} catch (Exception e) {
			System.out.println("Error al crear filtro " + e);
			filtroSQL.setCampoOrden("ac.id");
			filtroSQL.setTipoOrden("desc");
		}
	}
	/*
	 * Metodo para recorrer y validar los tipos de campos seleccionados
	 */
	public List<AtencionClienteBean> listaSeleccionados(List<AtencionClienteBean> listaRequest) {
		List<AtencionClienteBean> response = new ArrayList<AtencionClienteBean>();
		for (AtencionClienteBean listaBean : listaRequest) {
			AtencionClienteBean bean = new AtencionClienteBean();
				bean.setId(listaBean.getId());
				bean.setActive(listaBean.getActive());
				bean.setApellido(listaBean.getApellido());
				bean.setAreaEmpresaId(listaBean.getAreaEmpresaId());
				bean.setAsunto(listaBean.getAsunto());
				bean.setEmail(listaBean.getEmail());
				bean.setMotivo(listaBean.getMotivo());
				bean.setNombre(listaBean.getNombre());
				bean.setTelefono(listaBean.getTelefono());
				bean.setEstadoId(listaBean.getEstadoId());
				bean.setTemaAtencionId(listaBean.getTemaAtencionId());
			response.add(bean);
		}
		return response;
	}
	public void cargarEstados(){
		try{
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			List<FiltrosBean> listaCampos = new ArrayList<FiltrosBean>();
			List<Object> valores = new ArrayList<>();
			FiltrosBean filtros = new FiltrosBean();
			List<String> campos = new ArrayList<String>();
			campos.add("active");
			filtros.setCampos(campos);
			listaCampos.add(filtros);
			filtros.setOperador("=");
			valores.add(true);
			filtroSQL.setListaFiltros(listaCampos);
			filtroSQL.setListaValores(valores);
			filtroSQL.setCampoOrden("nombre");
			filtroSQL.setTipoOrden("asc");
			ListaEstadosAtencionClienteResponse response = mantEstadosAtencionClienteService.listaEstadosAtencionCliente(ObtenerIdTransaccion(), filtroSQL);
			if(response.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaEstadosAtencionCliente = response.getListaEstadosAtencionCliente();
			}
		}catch(Exception e){
			System.out.println("Error al mostrar Estados  " + e.getMessage());
		}
	}
}
